{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# COMPSCI 389: Homework 2\n", "\n", "**Assigned**: March 5, 2024. **Due**: March 12, 2024 at 2:00pm Eastern. **Note**: Submissions received after 2:00pm Eastern on March 19, 2024 will receive no credit.\n", "\n", "**Submitting**: Upload your submission on Gradescope as a `.pdf`. Converting to a PDF can be a complicated process, and so we encourage you to test this process well in advance of the submission deadlines. We recommend converting to HTML, opening the HTML file in a browser, and then printing or exporting to a PDF from your browser. We do not recommend directly converting to a PDF, since this requires installing xelatex. To convert to HTML in VSCode, press `ctrl+shift+p` and type `export`, and you should see an option to export to HTML.\n", "\n", "**Note**: Keep your `.ipynb` file, as we may request it directly (via email).\n", "\n", "**Note**: When converting to a PDF file, ensure that all of your code cells have been executed. The results of these executions *must* be included in your submitted PDF." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Instructions\n", "\n", "Complete the questions below, replacing the blue text with your own answers (your answers do not need to remain in blue). Do **not** modify the green text. Try to answer the questions without consulting your notes or any online material. If you cannot, then consult your notes, and if absolutely necessary, consult course materials (slides, notebooks) and/or Wikipedia. Do **not** use other sources or tools like ChatGPT. Complete this part of the assignment on your own (do **not** work with others).\n", "\n", "After you have completed all of the questions, at the bottom of this assignment you will find a link to another notebook, `Homework 2 Solutions.ipynb`. This contains the solutions, and instructions for ensuring that your answers are correct and sufficient. Make another pass through your homework assignment, replacing the green text with descriptions of what you missed for each question, and providing the fixes necessary to make your answer correct. **The solutions file may include additional instructions, which may include additional content to respond to even if you got a question correct (e.g., additional reflection).** During this second stage where you are filling in your answers, replacing the green text, you may reference the solutions, work with others, and use any tools (including ChatGPT).\n", "\n", "You will only submit this assignment once after replacing both the blue and green text. You do not need to submit the assignment between the first and second passes. Grading for each question will be based on whether you followed this process, and arrived at the correct answers and have sufficient discussion/text in the end. Points will be deducted if you did not make a reasonable effort to answer the question initially, if your final answer remains incorrect, of if your answers were not sufficiently clear (so, write in full sentences with proper punctuation, and conveying your arguments clearly). Other than verifying that you made a reasonable initial effort for your initial answers (blue), points will **not** be deducted due to *initial* answers being incorrect. Hence, there is no reason to break the rules to obtain correct answers initially." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Part 1: Short Answer\n", "\n", "Answer the following questions with at least a few sentences, and no more than roughly one page of text." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1. [10 points] What is the the difference between a parametric and a non-parametric method in machine learning?\n", "\n", "***Initial Answer***\n", "\n", "Replace this text with your answer.\n", "\n", "---\n", "\n", "***Updated Answer***\n", "\n", "Replace this text with your response to the solution document.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2. [20 points] State whether the following parametric model is a linear parametric model. Explain your answer.\n", "\n", "Let $g_v$ be a linear parametric model with weights $v \\in \\mathbb R^m$ and basis $\\phi$. We will create a new parametric model, $f_w$, with weights $w \\in \\mathbb R^{2m}$. Let $w=[v,v']$, i.e., let $w$ be the concatenation of two different weight vectors $v \\in \\mathbb R^m$ and $v' \\in \\mathbb R^m$. Then, let $f_w$ be defined as:\n", "$$\n", "f_w(x_i) = \\max\\Big \\{ g_{v}(x_i), g_{v'}(x_i)\\Big \\}.\n", "$$\n", "\n", "Is this parametric model, $f_w$, a linear parametric model? Why or why not?\n", "\n", "**Note**: You may use any online resources (e.g., ChatGPT) to help you format equations using LaTeX.\n", "\n", "***Initial Answer***\n", "\n", "Replace this text with your answer.\n", "\n", "---\n", "\n", "***Updated Answer***\n", "\n", "Replace this text with your response to the solution document.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3. [10 points] How can you estimate the the mean squared error (MSE) of a particular parametric ML model $f_w$ given access to data, $D=(X_i,Y_i)_{i=1}^n$?\n", "\n", "**Note**: Here the weights $w$ have already been determined independent of the data $D$. You may write $f_w(x)$ to denote the prediction made by the model when given input $x$.\n", "\n", "***Initial Answer***\n", "\n", "Replace this text with your answer.\n", "\n", "---\n", "\n", "***Updated Answer***\n", "\n", "Replace this text with your response to the solution document.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4. [10 points] How can you estimate the mean squared error (MSE) that would result if you used a specific ML algorithm `alg` to train a model using $m$ data points? \n", "\n", "You may assume access to $n>m$ data points. Your answer may be short - specifying a method or approach that we have discussed and why it is appropriate.\n", "\n", "***Initial Answer***\n", "\n", "Replace this text with your answer.\n", "\n", "---\n", "\n", "***Updated Answer***\n", "\n", "Replace this text with your response to the solution document.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5. [10 points] Imagine that you have a current model for a regression problem with mean squared error (MSE) $2.0$. If we have $n=150$ data points, we train a model using $100$ and compute the sample mean squared error (MSE) on the other $50$ points, and we obtain a sample MSE of $1.2$, can we conclude that the new model is better (has lower MSE) than the current model? Why or why not?\n", "\n", "***Initial Answer***\n", "\n", "Replace this text with your answer.\n", "\n", "---\n", "\n", "***Updated Answer***\n", "\n", "Replace this text with your response to the solution document.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6. [10 points] Derive the gradient descent update equations for the following loss function.\n", "\n", "Let $L(w,D)=\\sum_{i=1}^n 1 + \\sin(2 \\pi (y_i - \\hat y_i - 1/4))$, where $y_i$ is the label associated with the $i^\\text{th}$ point and $\\hat y_i$ is the model's prediction of $y_i$. The code snippet below this question creates a plot of this loss function. Notice that this loss function indicates that the lass associated with an error scales with its distance from the closest integer. Errors equal to integer values result in no loss at all, while errors half way between integers result in the largest loss.\n", "\n", "Consider a linear parametric model:\n", "$$\n", "f_w(x_i) = \\frac{1}{n}\\sum_{j=1}^m w_j \\phi_j(x_i),\n", "$$\n", "where $\\phi(x_i) \\in \\mathbb R^m$. Derive the gradient update rule for $w_j$. Your final answer should not include any derivative or gradient symbols (work out what these derivatives/gradients are).\n", "\n", "**Note:** Remember that $\\frac{\\partial}{\\partial x} \\sin(f(x)) = \\cos(f(x)) \\frac{\\partial}{\\partial x} f(x)$.\n", "\n", "**Note:** This problem is worth 2-4 times the number of points of previous problems, and should take a correspondingly longer amount time to complete. I recommend working this out first with pencil and paper, double checking your derivatives, and then typing your answer.\n", "\n", "***Initial Answer***\n", "\n", "Replace this text with your answer.\n", "\n", "---\n", "\n", "***Updated Answer***\n", "\n", "Replace this text with your response to the solution document.\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Define the function\n", "def f(x):\n", " return 1 + np.sin(2 * np.pi * (x - 0.25))\n", "\n", "x = np.linspace(-2, 2, 400)\n", "y = f(x)\n", "plt.plot(x, y)\n", "plt.xlabel('y_i - \\hat y_i')\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Part 2: Programming\n", "\n", "The code below defines `evaluate_features`, which performs $k$-fold cross-validation to estimate the MSE that results when a linear parametric model is trained on the provided data." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from sklearn.model_selection import cross_val_score\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.model_selection import KFold\n", "from sklearn.metrics import make_scorer, mean_squared_error\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.pipeline import Pipeline\n", "\n", "# Function to perform k-fold cross-validation for regression\n", "def evaluate_features(X, y, n_splits=50, random_state=42):\n", " \"\"\"\n", " Evaluate features using k-fold cross-validation for regression.\n", "\n", " Parameters:\n", " X (DataFrame): The feature set.\n", " y (Series): The labels (continuous values).\n", " n_splits (int): The number of folds for cross-validation.\n", " random_state (int): The seed used by the random number generator.\n", "\n", " Returns:\n", " float: The average MSE across all folds.\n", " \"\"\"\n", " # Create a pipeline with a standard scaler and a linear regression model\n", " pipeline = Pipeline([\n", " ('scaler', StandardScaler()),\n", " ('model', LinearRegression())\n", " ])\n", "\n", " # Define the k-fold cross-validation method\n", " kf = KFold(n_splits=n_splits, shuffle=True, random_state=random_state)\n", "\n", " # Perform cross-validation and calculate MSE\n", " scores_mse = cross_val_score(pipeline, X, y, cv=kf, scoring=make_scorer(mean_squared_error))\n", "\n", " return scores_mse.mean()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code below loads the GPA data and uses `evaluate_features` to determine the MSE likely to result from trainin a linear model on this data." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Average MSE: 0.5820102673423404\n" ] } ], "source": [ "# Load the data set\n", "df = pd.read_csv(\"https://people.cs.umass.edu/~pthomas/courses/COMPSCI_389_Spring2024/GPA.csv\", delimiter=',') # Read GPA.csv, assuming numbers are separated by commas\n", "\n", "# Split the data into features and labels\n", "X = df.iloc[:, :-1]\n", "y = df.iloc[:, -1]\n", "\n", "# Evaluate the features\n", "average_mse = evaluate_features(X, y)\n", "print(f\"Average MSE: {average_mse}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Due to the use of a fixed random number seed, each time you run this you should obtain the same result:\n", "> Average MSE: 0.5820105070662254\n", "\n", "#### 1. [20 points] In the code block below, perform **feature engineering** to come up with additional features that improve the predictions, reducing the reported average MSE to at most $0.573$.\n", "\n", "**Note**: This may require experimenting with many different additional features that can be added! Try out many different features to see how low you can get the average MSE.\n", "\n", "**Note**: There exist features that achieve an average MSE *less than* $0.57$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***Initial Answer***\n", "\n", "Delete this line and enter your initial answer in the code cell below.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Average MSE: 0.582160173827006\n" ] } ], "source": [ "# NOTE: We recommend leaving these initial lines, so that if you re-run this cell many times you don't append multiple new features to the data set unintentionally\n", "df = pd.read_csv(\"https://people.cs.umass.edu/~pthomas/courses/COMPSCI_389_Spring2024/GPA.csv\", delimiter=',') # Read GPA.csv, assuming numbers are separated by commas\n", "X = df.iloc[:, :-1]\n", "y = df.iloc[:, -1]\n", "\n", "####################################################################################\n", "# ENTER YOUR INITIAL ANSWER HERE\n", "# Replace the line below, which appends a feature that does not improve the fit.\n", "X['avg_stem_score'] = X[['physics', 'math', 'chemistry']].mean(axis=1)\n", "####################################################################################\n", "\n", "# Evaluate the features\n", "average_mse = evaluate_features(X, y)\n", "print(f\"Average MSE: {average_mse}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***Updated Answer***\n", "\n", "Replace this text with your response to the solution document.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5. [10 points] Reflect on this feature engineering process.\n", "\n", "Write a paragraph reflecting on the feature engineering process. What kinds of features did you try first? Did you change approaches or change the types of features you added? Did you try including features that were linear combinations of existing features (that is, weighted summations of existing features, like averages of a subset of the features)? Did you then make a deliberate effort to create new features that are not linear combinations of existing features? Why do you think the best features you found are effective?\n", "\n", "***Initial Answer***\n", "\n", "Replace this text with your answer.\n", "\n", "---\n", "\n", "***Updated Answer***\n", "\n", "Replace this text with your response to the solution document.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The solutions can be found here: [https://people.cs.umass.edu/~pthomas/courses/COMPSCI_389_Spring2024/Homework%202%20Solutions.ipynb](https://people.cs.umass.edu/~pthomas/courses/COMPSCI_389_Spring2024/Homework%202%20Solutions.ipynb)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.7" } }, "nbformat": 4, "nbformat_minor": 2 }